package com.rectcircle.scalatrateset.auth

import com.rectcircle.scalatrateset.auth.strategies.{RememberMeStrategy, UserLoginStrategy}
import com.rectcircle.scalatrateset.model.User
import org.scalatra.ScalatraBase
import org.scalatra.auth.{ScentryConfig, ScentrySupport}

/**
  * 身份验证的配置入口
  *
  */
trait AuthenticationSupport extends ScalatraBase with ScentrySupport[User] {
	self: ScalatraBase =>
	
	//两个函数是获取User信息时调用的函数
	//一般情况下不需要覆写

	//每一个（通过验证的请求的）请求进来，执行一次，保持数据有效性
	//如果需要覆写一般查询数据库，调用Dao操作
	protected def fromSession = {
		case id: String => {
			println("调用了fromSession")
			new  User("foo","foo")
		}
	}
	
	//只在执行完验证策略通过之后调用一次，获得一个Id缓存下来，交由fromsession来获取user对象
	protected def toSession   = {
		case usr: User => {
			println("调用了toSession")
			usr.username
		}
	}
	
	protected val scentryConfig = (new ScentryConfig {
		override val login = "/login"
	}).asInstanceOf[ScentryConfiguration]
	
	/**
	  * 如果没有登陆，跳转到登陆页面
	  */
	protected def requireLogin() = {
		if(!isAuthenticated) {
			redirect(scentryConfig.login)
		}
	}
	
	/**
	  * 如果未经身份验证的用户试图访问一个路由，会受到安全保护，
	  * 运行在UserPasswordStrategy（密码验证策略）unauthenticated()方法。
	  */
	override protected def configureScentry = {
		scentry.unauthenticated {
			scentry.strategies("UserLogin").unauthenticated()
		}
	}
	
	/**
	  * 用户身份验证的策略，任何混入这个特质的控制器都会，逐步执行这里注册的验证策略。
	  */
	override protected def registerAuthStrategies = {
		scentry.register("UserPassword", app => new UserLoginStrategy(app))
		scentry.register("RememberMe", app => new RememberMeStrategy(app))
	}
	
}

